package ca.qc.bdeb.jeuxdesboites.model;

import ca.qc.bdeb.jeuxdesboites.commun.IDJoueurs;
import ca.qc.bdeb.utilitaires.Minuterie;
import java.util.EnumMap;

/**
 *
 * @author Eric Wenaas <eric.wenaas@bdeb.qc.ca>
 */
final class Horloge {

    
    private EnumMap<IDJoueurs, Minuterie> horlogesDesJoueurs;
    private IDJoueurs joueurActif;
    
    public Horloge(long tempsEnMillis) {
        initilaliserHorloges(tempsEnMillis);
        joueurActif = null;
    }
    
    private void initilaliserHorloges(long tempsEnMillis) {
        horlogesDesJoueurs = new EnumMap<>(IDJoueurs.class);
        for (IDJoueurs id: IDJoueurs.values()) {
            horlogesDesJoueurs.put(id, new Minuterie(tempsEnMillis));        
        }
    }
    
    void activer(IDJoueurs horlogeDuJoueur) {
        if (joueurActif != null) {
            horlogesDesJoueurs.get(joueurActif).setMinuterieActive(false);
        }
        horlogesDesJoueurs.get(horlogeDuJoueur).setMinuterieActive(true);
        joueurActif = horlogeDuJoueur;
    }
    
    boolean isActive(IDJoueurs id) {
        Minuterie timer = horlogesDesJoueurs.get(id);
        return timer.isActive();
    }
        
    void demarrerHorloges() {
        for (IDJoueurs id: IDJoueurs.values()) {
            horlogesDesJoueurs.get(id).start();
        }
    }
    
    void arreterHorloges() {
        for (IDJoueurs id: IDJoueurs.values()) {
            horlogesDesJoueurs.get(id).setMinuterieActive(false);
        }
        joueurActif = null;
    }
    
    void activerProchaineHorloge() {
        if (joueurActif == null) {
            throw new IllegalStateException("Aucune horloge active");
        }
        int pos = joueurActif.ordinal();
        if (pos == IDJoueurs.values().length -1) {
            pos = 0;
        } else {
            pos++;
        }
        activer(IDJoueurs.values()[pos]);
    }

    long getRemainingTime(IDJoueurs clockID) {
        Minuterie actualTimer = horlogesDesJoueurs.get(clockID);
        return actualTimer.getTempsRestantEnMillis();
    }
}
